package uy.org.softtech.cssuite.web.entidad;

import static org.springframework.util.Assert.notNull;

import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;

import javax.xml.bind.annotation.XmlTransient;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;

import uy.org.softtech.cssuite.entidad.usuario.Permiso;
import uy.org.softtech.cssuite.entidad.usuario.Usuario;

/**
 * Clase que implementa {@link UserDetails} y representa a un usuario autenticado y autorizado en la aplicación.
 *
 * @author fabian.lobo
 */
@XmlTransient
public class DetalleUsuario implements UserDetails {

	private static final long serialVersionUID = 6558594722248393502L;
	
	private final Usuario usuario;
	private String direccion;
	private String navegador;
	private String lenguaje;	
	
	/**
	 * Constructor que inicializa a nuevo {@link DetalleUsuario} con la instancia de {@link User} dada.
	 *
	 * @param usuario - Instancia del usuario autenticado
	 */
	public DetalleUsuario(final Usuario usuario){
		notNull(usuario, "El usuario no puede ser nulo");
		this.usuario = usuario;
	}
	
	/* (non-Javadoc)
	 * @see org.springframework.security.core.userdetails.UserDetails#getAuthorities()
	 */
	@Override
	public Collection<GrantedAuthority> getAuthorities() {
		Set<GrantedAuthority> result = new LinkedHashSet<GrantedAuthority>();
	    result.add(new Autorizacion("ROLE_AUTENTICADO"));
	    for(Permiso permiso : this.usuario.getRol().getPermisos()){
	    	result.add(new Autorizacion("ROLE_" + permiso.getToken()));
	    }
	    return result;
	}

	/* (non-Javadoc)
	 * @see org.springframework.security.core.userdetails.UserDetails#getPassword()
	 */
	@Override
	public String getPassword() {
		return getUsuario().getPassword();
	}

	/* (non-Javadoc)
	 * @see org.springframework.security.core.userdetails.UserDetails#getUsername()
	 */
	@Override
	public String getUsername() {
		return getUsuario().getUsuario();
	}

	/* (non-Javadoc)
	 * @see org.springframework.security.core.userdetails.UserDetails#isAccountNonExpired()
	 */
	@Override
	public boolean isAccountNonExpired() {
		return isEnabled();
	}

	/* (non-Javadoc)
	 * @see org.springframework.security.core.userdetails.UserDetails#isAccountNonLocked()
	 */
	@Override
	public boolean isAccountNonLocked() {
		return isEnabled();
	}

	/* (non-Javadoc)
	 * @see org.springframework.security.core.userdetails.UserDetails#isCredentialsNonExpired()
	 */
	@Override
	public boolean isCredentialsNonExpired() {
		return isEnabled();
	}

	/* (non-Javadoc)
	 * @see org.springframework.security.core.userdetails.UserDetails#isEnabled()
	 */
	@Override
	public boolean isEnabled() {
		return !getUsuario().isEliminado() && !getUsuario().isBloqueado();
	}

	/*
	 *  GETTERS
	 */
	public Usuario getUsuario() {
		return usuario;
	}
	/**
	 * @see Usuario#convierteUltimoLogin()
	 */
	public String getUltimoLogin() {
		return usuario.convierteUltimoLogin();
	}
	/**
	 * @see Usuario#convierteNombreCompleto()
	 */
	public String getNombreCompleto() {
		return usuario.convierteNombreCompleto();
	}
	public String getDireccion() {
		return direccion;
	}
	public String getNavegador() {
		return navegador;
	}
	public String getLenguaje() {
		return lenguaje;
	}

	/*
	 *  SETTERS
	 */
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}
	public void setNavegador(String navegador) {
		this.navegador = navegador;
	}
	public void setLenguaje(String lenguaje) {
		this.lenguaje = lenguaje;
	}
	
}
